1. 3D Secure 2 - Datos adicionales


3D Secure 2 permite el envío de un conjunto de datos mucho mayor que su predecesor. Cuantos más datos se envíen, más información tendrá el Emisor al tomar la decisión de si la autenticación de la transacción debe realizarse a través de un flujo sin fricción o de desafío.

Los tipos de datos disponibles para enviar incluyen:

  • Cuenta de cliente con el comercio (fecha de creación e historial)
  • Tarjeta de regalo
  • Información periódica y de cuotas
  • Autenticación 3D Secure 2 previa
  • Autenticación comercial del cliente

<?php
// Imports necesarios para realizar una aturoización
require_once('vendor/autoload.php');

use AddonPayments\Api\Entities\Address;
use AddonPayments\Api\Entities\Enums\AddressType;
use AddonPayments\Api\ServicesConfig;
use AddonPayments\Api\HostedPaymentConfig;
use AddonPayments\Api\Entities\HostedPaymentData;
use AddonPayments\Api\Entities\Enums\HppVersion;
use AddonPayments\Api\Entities\Exceptions\ApiException;
use AddonPayments\Api\Services\HostedService;

// Configuración del terminal
$config = new ServicesConfig();
$config->merchantId = "Merchant_ID";
$config->accountId = "Sub_Account";
$config->sharedSecret = "Shared_Secret";
$config->serviceUrl = "URL";
$config->hostedPaymentConfig = new HostedPaymentConfig();
$config->hostedPaymentConfig->version = HppVersion::VERSION_2;
$service = new HostedService($config);

// Añadimos los campos obligatorios de 3DS2 de dirección de facturación
$billingAddress = new Address();
$billingAddress->streetAddress1 = "Dirección de facturación 1";
$billingAddress->streetAddress2 = "Dirección de facturación 2";
$billingAddress->streetAddress3 = "Dirección de facturación 3";
$billingAddress->city = "Ciudad de facturación";
$billingAddress->postalCode = "Código postal de facturación";
$billingAddress->country = "País de facturación";

// Añadimos los campos obligatorios de 3DS2 de dirección de envío
$shippingAddress = new Address();
$shippingAddress->streetAddress1 = "Dirección de envío 1";
$shippingAddress->streetAddress2 = "Dirección de envío 2";
$shippingAddress->streetAddress3 = "Dirección de envío 3";
$shippingAddress->city = "Ciudad de envío";
$shippingAddress->state = "Código ISO del país de envío";
$shippingAddress->postalCode = "Código postal de envío";
$shippingAddress->country = "País de envío";

// Añadimos los campos obligatorios de 3DS2 del cliente
$hostedPaymentData = new HostedPaymentData();
$hostedPaymentData->customerEmail = "customer@email.com";
$hostedPaymentData->customerPhoneMobile = "34|914353028";
$hostedPaymentData->addressesMatch = True;
// Datos adicionales
$hostedPaymentData->challengeRequest = "NO_PREFERENCE";
$hostedPaymentData->customerWorkNumber = "44|07123456789";
$hostedPaymentData->accountAgeDate = "20190110";
$hostedPaymentData->accountAgeIndicator = "NO_ACCOUNT";
$hostedPaymentData->accountChangeDate = "20190128";
$hostedPaymentData->customerHomeNumber = "44|07123456789";
$hostedPaymentData->accountChangeIndicator = "THIS_TRANSACTION";
$hostedPaymentData->accountPassChangeDate = "20190115";
$hostedPaymentData->accountPassChangeIndicator = "THIS_TRANSACTION";
$hostedPaymentData->accountPurchaseCount = "3";
$hostedPaymentData->transactionType = "GOODS_SERVICE_PURCHASE";
$hostedPaymentData->cardholderAccountIdentifier = "1f0aae6b-0bac-479f-9ee5-29b9b6cf3aa0";
$hostedPaymentData->suspiciousActivity = "SUSPICIOUS_ACTIVITY";
$hostedPaymentData->provisionAttemptsDay = "1";
$hostedPaymentData->paymentAccountAge = "201901101";
$hostedPaymentData->paymentAccountAgeIndicator = "NO_ACCOUNT";
$hostedPaymentData->deliveryEmail = "deliveryemail@email.com";
$hostedPaymentData->deliveryTimeframe = "TWO_DAYS_OR_MORE";
$hostedPaymentData->shipIndicator = "UNVERIFIED_ADDRESS";
$hostedPaymentData->shippingAddressUsage = "20190128";
$hostedPaymentData->shippingAddressUsageIndicator = "THIS_TRANSACTION";
$hostedPaymentData->shippingNameIndicator = "TRUE";
$hostedPaymentData->preorderDate = "20190212";
$hostedPaymentData->reorderItemIndicator = "FIRST_TIME_ORDER";
$hostedPaymentData->transactionActivityDay = "1";
$hostedPaymentData->transactionActivityYear = "3";
$hostedPaymentData->giftCardAmount = "250";
$hostedPaymentData->giftCardCount = "1";
$hostedPaymentData->giftCardCurrency = "EUR";
$hostedPaymentData->recurringMaxInstallments = "5";
$hostedPaymentData->recurringExpiry = "20190205";
$hostedPaymentData->recurringFrequency = "25";
$hostedPaymentData->priorTransAuthMethod = "FRICTIONLESS_AUTHENTICATION";
$hostedPaymentData->priorTransAuthIdentifier = "26c3f619-39a4-4040-bf1f-6fd433e6d615";
$hostedPaymentData->priorTransAuthTimestamp = "20190110125733";
$hostedPaymentData->priorTransAuthData = "string";
$hostedPaymentData->cardLoginAuthType = "MERCHANT_SYSTEM_AUTHENTICATION";
$hostedPaymentData->cardLoginAuthTimestamp = "20180613110212";
$hostedPaymentData->cardLoginAuthData = "string";
$hostedPaymentData->whiteListStatus = "False";

// Lanzamos la petición al servidor de Addon Payments
try {
$hppJson = $service->charge(20)
->withCurrency("EUR")
->withHostedPaymentData($hostedPaymentData)
->withAddress($billingAddress, AddressType::BILLING)
->withAddress($shippingAddress, AddressType::SHIPPING)
->serialize();

// Mostramos el formulario
echo $hppJson;

} catch (ApiException $e) {
// Añada aquí su tratamiento de errores
echo $e->getMessage();
}

?>

2. Flujos de autenticación


En este punto, el Emisor analizará la transacción. Tendrá en cuenta factores como los datos que su aplicación ha proporcionado junto con el comportamiento histórico del cliente y el análisis de transacciones. El resultado de este proceso determinará si el Emisor decide que el cliente debe autenticar aún más la transacción y realizar una comprobación con el ACS (flujo con fricción).


2.1 Flujo sin fricción

En un flujo sin fricciones, el Emisor puede determinar que no se requiere autenticación adicional, que la transacción puede continuar. O en base a la información que ha recibido hasta ahora, que la transacción no debería continuar.

En un escenario de transacción bloqueada, Addon Payments devolverá un mensaje de respuesta de falla a su aplicación/sitio web y puede optar por redirigir al cliente a la página de pago mientras le informa del resultado. De lo contrario, el HPP completará el proceso de autenticación y procederá a la autorización, incluidos los datos de autenticación de 3D Secure.


2.2 Flujo con fricción

En el caso de un flujo de fricción, el Emisor ha determinado que el cliente debe autenticar aún más la transacción. El HPP mostrará el Emisor ACS al cliente. El desafío puede implicar una serie de pasos, incluido que el cliente ingrese una contraseña de un solo uso enviada a su teléfono o responda algunas preguntas que solo él sabría responder.

El Emisor ACS determinará el tipo de desafío que se mostrará al cliente y se alineará con al menos dos elementos de la autenticación sólida del cliente (SCA):

  • Possession: Algo que solo el cliente tiene, por ejemplo, su dispositivo móvil registrado en su banco en el que recibirá un código en un SMS.
  • Inherence: Su huella digital u otra forma de datos biométricos.
  • Knowledge: Una frase de contraseña única o la respuesta a una pregunta personal.


2.3 Simulador ACS

En el entorno sandbox (pruebas), Addon Payments proporciona un simulador de Emisor ACS que le permite probar diferentes resultados de desafíos.

Una vez que se haya cargado el desafío, después de diez segundos, el simulador completará automáticamente la autenticación y generará una respuesta de Autenticación exitosa (transStatus = “Y”). Esto tiene la intención de imitar un escenario en el que un cliente ha recibido una notificación en su teléfono para autenticarse usando su aplicación bancaria.

Para simular una autenticación fallida, hacer clic en el botón "Cancelar" generará una respuesta fallida (transStatus = “N”). En cualquier escenario, el resultado se enviará en el mensaje de respuesta de desafío (CRes) al punto final de notificación de desafío.

Simulador ACS

2.4 Resultado del desafío

Con el cliente en el ACS, pueden ocurrir los siguientes resultados:

  • La autenticación es exitosa.
  • La autenticación falla y el cliente no tiene otra oportunidad.
  • La autenticación falla y el cliente tiene otra oportunidad.

Si el cliente ha completado con éxito el desafío y se ha autenticado, Addon Payments procederá a la autorización e incluirá los datos de autenticación de 3D Secure. Alternativamente, en un escenario de transacción bloqueada, HPP devolverá un mensaje de respuesta de fallo (110).

En este punto, tanto en escenarios sin fricciones como en escenarios de desafío, la transacción puede autorizarse o declinarse de manera normal en función de si el cliente tiene fondos suficientes en su cuenta o si ingresó su código de seguridad correctamente, etc. Addon Payments devolverá la respuesta de la transacción junto con los datos de autenticación de 3D Secure adicionales que puede capturar en su sitio web/aplicación.

3. Formulario de ejemplo


Para poder procesar la transacción con el formulario de ejemplo, debe modificar el archivo "Authorization.php" que se encuentra en la ruta "vendor\addonpayments\php-sdk\test\php\HPP\05 - 3DS2\01 - Autorización".

Debe introducir sus datos de configuración tal y como se muestra en el punto 2.1 de esta guía.


3.1 Formulario

El siguiente formulario le permite enviar una operación contra el entorno de pruebas de Addon Payments.


3.2 Respuesta de la operación
--> La respuesta se muestra al final de cada operación dentro del dominio de la pasarela de pagos. Si desea modificar dicha respuesta, puede acceder al archivo "response.php" y modificar los valores que quiera mostrar en la pasarela de pagos. Para obtener más información sobre la excepción de "try - catch" puede ver la documentación oficial de PHP.